package br.com.salao.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import br.com.salao.bean.Bairro;
import br.com.salao.bean.Endereco;
import br.com.salao.util.JpaUtil;


public class BairroDaoImpl implements BairroDao {

	private final GenericDao<Bairro> dao;

	public BairroDaoImpl(EntityManager em){
		dao = new GenericDao<Bairro>(em, Bairro.class);
	}

	@Override
	public Bairro incluir(Bairro bairro) {
		return dao.salvar(bairro);
	}

	public Bairro buscar(int id) {

		EntityManager em = JpaUtil.getEntityManager();

		Bairro bairro = null;
		
		try {

			Query query = em.createQuery("from Bairro c where c.id = :id");
			query.setParameter("id", id);
			bairro = (Bairro) query.getSingleResult();

		} catch (Exception e) {
			e.printStackTrace();

		} finally {
			if(em != null)
				em.close();
		}
		return bairro;
	}

	public Bairro buscarBairroPorNome(Bairro bairro){

		EntityManager em = JpaUtil.getEntityManager();

		try{
			Query query = em.createQuery("from Bairro b where b.descricao like :bairro");
			query.setParameter("bairro", bairro.getDescricao());
			bairro = (Bairro) query.getSingleResult();

		}catch (Exception e) {
			bairro = null;			
		}finally{
			if(em != null){
				em.close();
			}
		}
		return bairro;
	}

	@SuppressWarnings("unchecked")
	public List<Bairro> listarBairrosPorIdCidade(int idCidade){

		EntityManager em =  JpaUtil.getEntityManager();
		List<Bairro> bairros = null;

		try {

			Query query = em.createQuery("from Bairro c where c.cidade.id = :idCidade");
			query.setParameter("idCidade", idCidade);
			bairros = (List<Bairro>)query.getResultList();

		} catch (Exception e) {
			e.printStackTrace();

		} finally {
			if(em != null)
				em.close();
		}
		return bairros;
	}

	public List<Bairro> buscarBairrosDeEstabelecimentosCadastrados(){

		EntityManager em =  JpaUtil.getEntityManager();

		CriteriaBuilder builder = em.getCriteriaBuilder();
		CriteriaQuery<Bairro> cQuery = builder.createQuery(Bairro.class);
		Root<Bairro> from = cQuery.from(Bairro.class);

		Join<Bairro, Endereco> joinEndereco = from.join("endereco", JoinType.LEFT);

		Predicate p = builder.equal( joinEndereco.get("endereco").get("bairro"), Bairro.class );

		cQuery.where(p);

		TypedQuery<Bairro> query = em.createQuery(cQuery);

		return query.getResultList();

	}

}
